﻿using System;
using System.Data;
using System.Data.SqlClient;
using BadgeManager.Model;

namespace BadgeManager.Controller
{
    public class ctrlUtente : Utente
    {
        private Connector conn;

        public ctrlUtente()
        {
            conn = Connector.Istance();
        }

        /// <summary>
        /// Restituisce il numero di utenti registrati
        /// </summary>
        /// <returns></returns>
        public int ControllaPrimoAccount()
        {
            string sql = "";
            sql = "select id from Utenti ";

            SqlDataAdapter com = new SqlDataAdapter(sql, conn.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);

            return dt.Rows.Count;
        }

        /// <summary>
        /// Effettua il login dell'utente
        /// </summary>
        /// <param name="utente"></param>
        /// <returns></returns>
        public Utente LoginUtente(Utente utente)
        {
            string sql = "";
            sql = "select id,nomeutente,password from Utenti "
                + " where nomeutente='" + utente.NomeUtente.Replace("'", "''") + "' "
                + " and password='" + utente.Password.Replace("'", "''") + "'";

            SqlDataAdapter com = new SqlDataAdapter(sql, conn.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                utente.Id = (Guid)dt.Rows[0]["id"];
                utente.NomeUtente = dt.Rows[0]["nomeutente"].ToString();
                return utente;
            }
            else
                return null;
        }

        /// <summary>
        /// Registra un nuovo utente
        /// </summary>
        /// <param name="utente"></param>
        /// <returns></returns>
        public int CreaUtente(Utente utente)
        {
            string sql = "";
            sql = "insert into Utenti values(@id,@nomeutente,@password,@dataregistrazione)";

            SqlCommand insert = new SqlCommand(sql, conn.Connessione);

            SqlParameter id = new SqlParameter();
            id.SqlDbType = SqlDbType.UniqueIdentifier;
            id.ParameterName = "@id";
            id.Value = utente.Id;
            insert.Parameters.Add(id);

            SqlParameter nomeutente = new SqlParameter();
            nomeutente.SqlDbType = SqlDbType.NVarChar;
            nomeutente.ParameterName = "@nomeutente";
            nomeutente.Value = utente.NomeUtente;
            insert.Parameters.Add(nomeutente);

            SqlParameter password = new SqlParameter();
            password.SqlDbType = SqlDbType.NVarChar;
            password.ParameterName = "@password";
            password.Value = utente.Password;
            insert.Parameters.Add(password);

            SqlParameter dataregistrazione = new SqlParameter();
            dataregistrazione.SqlDbType = SqlDbType.Date;
            dataregistrazione.ParameterName = "@dataregistrazione";
            dataregistrazione.Value = utente.DataRegistrazione;
            insert.Parameters.Add(dataregistrazione);

            return insert.ExecuteNonQuery();
        }

        /// <summary>
        /// Registra un nuovo permesso associato all'idutente
        /// </summary>
        /// <param name="utente"></param>
        /// <returns></returns>
        public int CreaPermesso(Utente utente)
        {
            string sql = "";
            sql = "insert into Permessi (idutente,lettura,scrittura,modifica,sa) "
                    + "values(@idutente,@lettura,@scrittura,@modifica,@sa)";

            SqlCommand insert = new SqlCommand(sql, conn.Connessione);

            SqlParameter id = new SqlParameter();
            id.SqlDbType = SqlDbType.UniqueIdentifier;
            id.ParameterName = "@idutente";
            id.Value = utente.Id;
            insert.Parameters.Add(id);

            SqlParameter lettura = new SqlParameter();
            lettura.SqlDbType = SqlDbType.Bit;
            lettura.ParameterName = "@lettura";
            lettura.Value = utente.Permesso.Lettura;
            insert.Parameters.Add(lettura);

            SqlParameter scrittura = new SqlParameter();
            scrittura.SqlDbType = SqlDbType.Bit;
            scrittura.ParameterName = "@scrittura";
            scrittura.Value = utente.Permesso.Scrittura;
            insert.Parameters.Add(scrittura);

            SqlParameter modifica = new SqlParameter();
            modifica.SqlDbType = SqlDbType.Bit;
            modifica.ParameterName = "@modifica";
            modifica.Value = utente.Permesso.Modifica;
            insert.Parameters.Add(modifica);

            SqlParameter sa = new SqlParameter();
            sa.SqlDbType = SqlDbType.Bit;
            sa.ParameterName = "@sa";
            sa.Value = utente.Permesso.Sa;
            insert.Parameters.Add(sa);

            return insert.ExecuteNonQuery();
        }

        /// <summary>
        /// Modifica i permessi dell'utente
        /// </summary>
        /// <param name="utente"></param>
        /// <returns></returns>
        public int ModificaPermesso(Utente utente)
        {
            string sql;
            sql = "update Permessi set "
                + " lettura=@lettura,scrittura=@scrittura,modifica=@modifica,sa=@sa "
                + " where idutente=@condizione";

            SqlCommand update = new SqlCommand(sql, conn.Connessione);

            SqlParameter lettura = new SqlParameter();
            lettura.SqlDbType = SqlDbType.Bit;
            lettura.ParameterName = "@lettura";
            lettura.Value = utente.Permesso.Lettura;
            update.Parameters.Add(lettura);

            SqlParameter scrittura = new SqlParameter();
            scrittura.SqlDbType = SqlDbType.Bit;
            scrittura.ParameterName = "@scrittura";
            scrittura.Value = utente.Permesso.Scrittura;
            update.Parameters.Add(scrittura);

            SqlParameter modifica = new SqlParameter();
            modifica.SqlDbType = SqlDbType.Bit;
            modifica.ParameterName = "@modifica";
            modifica.Value = utente.Permesso.Modifica;
            update.Parameters.Add(modifica);

            SqlParameter sa = new SqlParameter();
            sa.SqlDbType = SqlDbType.Bit;
            sa.ParameterName = "@sa";
            sa.Value = utente.Permesso.Modifica;
            update.Parameters.Add(sa);

            SqlParameter condizione = new SqlParameter();
            condizione.SqlDbType = SqlDbType.UniqueIdentifier;
            condizione.ParameterName = "@condizione";
            condizione.Value = utente.Id;
            update.Parameters.Add(condizione);

            return update.ExecuteNonQuery();
        }

        #region "Metodi di controllo permessi"

        public bool PuoLeggere(Utente utente)
        {
            string sql = "";
            sql = "select idutente,lettura from Permessi "
                + " where idutente='" + utente.Id + "'";

            SqlDataAdapter com = new SqlDataAdapter(sql, conn.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count > 0)
                return (bool)dt.Rows[0]["lettura"];
            return true;
        }

        public bool PuoScrivere(Utente utente)
        {
            string sql = "";
            sql = "select idutente,scrittura from Permessi "
                + " where idutente='" + utente.Id + "'";
            SqlDataAdapter com = new SqlDataAdapter(sql, conn.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count > 0)
                return (bool)dt.Rows[0]["scrittura"];
            return false;
        }

        public bool PuoModificare(Utente utente)
        {
            string sql = "";
            sql = "select idutente,modifica from Permessi "
                + " where idutente='" + utente.Id + "'";
            SqlDataAdapter com = new SqlDataAdapter(sql, conn.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count > 0)
                return (bool)dt.Rows[0]["modifica"];
            return false;
        }

        public bool isSuperAdmin(Utente utente)
        {
            string sql = "";
            sql = "select idutente,sa from Permessi "
                + " where idutente='" + utente.Id + "'";
            SqlDataAdapter com = new SqlDataAdapter(sql, conn.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            if (dt.Rows.Count > 0)
                return (bool)dt.Rows[0]["sa"];
            return false;
        }

        #endregion "Metodi di controllo permessi"

        /// <summary>
        /// Modifica la password di un'utente
        /// </summary>
        /// <param name="utente"></param>
        /// <returns>-1 se l'utente non è davvero lui</returns>
        public int ModificaPassword(Utente utente)
        {
            string sql = "";
            sql = "update Utenti set password=@password "
                + " where id=@id and nomeutente=@nomeutente";

            SqlCommand modifica = new SqlCommand(sql, conn.Connessione);

            SqlParameter id = new SqlParameter();
            id.SqlDbType = SqlDbType.UniqueIdentifier;
            id.ParameterName = "@id";
            id.Value = utente.Id;
            modifica.Parameters.Add(id);

            SqlParameter nomeutente = new SqlParameter();
            nomeutente.SqlDbType = SqlDbType.NVarChar;
            nomeutente.ParameterName = "@nomeutente";
            nomeutente.Value = utente.NomeUtente;
            modifica.Parameters.Add(nomeutente);

            SqlParameter password = new SqlParameter();
            password.SqlDbType = SqlDbType.NVarChar;
            password.ParameterName = "@password";
            password.Value = utente.Password;
            modifica.Parameters.Add(password);

            return modifica.ExecuteNonQuery();
        }

        /// <summary>
        /// Cancella l'utente verificando id e nomeutente
        /// </summary>
        /// <param name="utente"></param>
        /// <returns></returns>
        public int CancellaUtente(Utente utente)
        {
            string sql = "";
            sql = "delete from Utenti "
                + " where id=@id and nomeutente=@nomeutente";

            SqlCommand cancella = new SqlCommand(sql, conn.Connessione);

            SqlParameter id = new SqlParameter();
            id.SqlDbType = SqlDbType.UniqueIdentifier;
            id.ParameterName = "@id";
            id.Value = utente.Id;
            cancella.Parameters.Add(id);

            SqlParameter nomeutente = new SqlParameter();
            nomeutente.SqlDbType = SqlDbType.NVarChar;
            nomeutente.ParameterName = "@nomeutente";
            nomeutente.Value = utente.NomeUtente;
            cancella.Parameters.Add(nomeutente);

            return cancella.ExecuteNonQuery();
        }

        public DataTable SelezionaTutto()
        {
            string sql = "";
            sql = @"SELECT Utenti.id AS Id, Utenti.nomeutente AS Username,
                Utenti.dataregistrazione AS Data, Permessi.lettura AS Leggi,
                Permessi.scrittura AS Scrivi, Permessi.modifica AS Modifica, Permessi.sa as Amministratore
                FROM Utenti LEFT OUTER JOIN Permessi ON Utenti.id = Permessi.idutente";

            SqlDataAdapter com = new SqlDataAdapter(sql, conn.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);

            return dt;
        }

        public DataTable Ricerca()
        {
            string sql = "";
            sql = @"SELECT Utenti.id AS IdUtente, Utenti.nomeutente AS Username
                , Utenti.password AS Password, Utenti.dataregistrazione AS Registrazione
                , Permessi.lettura AS Lettura, Permessi.scrittura AS Scrittura, Permessi.modifica AS Modifica
                , Permessi.sa AS Amministratore
                FROM Utenti INNER JOIN
                      Permessi ON Utenti.id = Permessi.idutente";

            SqlDataAdapter com = new SqlDataAdapter(sql, conn.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);

            return dt;
        }
    }
}